perm filename MAP[F8,ALS] blob
sn#306687 filedate 1977-09-29 generic text, type C, neo UTF8
COMMENT ā VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 *MXP Code to convert joystick reading into cursor position on board.
C00013 ENDMK
Cā;
*MXP Code to convert joystick reading into cursor position on board.
*Cursor's position on the board image is limited to the playing squares.
*When the joystick is moved the cursor jumps from playing square to
*playing square, always landing on that square that is nearest to the
*indicated joystick position.
*
*Interrogates JOYI twice to get X and Y readings of joystick position.
*Returns byte in 3 (with one bit on for square) and byte number in 4 and
*moves cursor from old position on board image to new position.
*Uses reg 0, 1, 2, 3, 4, H, Q, and DC.
MXP LR K,P
PI PUSH
LIS H'01' GET X
LR HU,A
NOP
NOP
NOP
NOP
DI
DCI COM
LI H'65'
ST
DCI CMRG
ST
LI H'30'
PI WAIT
PI JOYI
LR 0,A
NOP
NOP
NOP
NOP
PI MXPA
LR A,0
LR 1,A
CLR
LR HU,A
NOP
NOP
NOP
NOP
PI JOYI
LR 0,A
NOP
NOP
NOP
NOP
*This code for compilers that accept : and .
LI INHR: Set INT vector in SMI
OUTS H'C'
LI INHR.
*This code for compilers that do not accept : and .
* DCI INHR
* LR Q,DC
* LR A,QU
* OUTS H'C'
* LR A,QL
*End of substitution
OUTS H'D'
LIS H'1'
DCI COM
LI BCMD
ST
DCI CMRG
ST
EI
NOP
NOP
NOP
NOP
PI MXPA
LR A,0
LR 2,A
AS 1
LR 3,A Unnormalized sum in 3
LIS H'8'
LR 0,A
LR A,3
MXP2 DS 0
AI H'F9' Sub 7
BP MXP2
LR A,0
LR 3,A Sum into 3, range 0 thru 6
LR A,1
COM
AI D'25'
AS 2
LR 4,A Unnormalized difference in 4
LIS H'9' Need 8 catagories for the difference
LR 0,A
LR A,4
MXP3 DS 0
AI H'FD' Sub 3
BP MXP3
LR A,0
LR 4,A Difference into 4, range 0 thru 7
COM
INC
AS 3
INC
LR 1,A Normalized X value
LR A,4
AS 3
INC
SR 1
LR 2,A Normalized Y value
SR 1
LR 4,A The byte number left in 4
LR A,1
SR 1
INC
LR 3,A
LIS H'8'
BR MXP5
MXP4 SR 1
MXP5 DS 3
BNZ MXP4
LR A,1
NI H'1'
BNZ MXP6
LR A,3
SR 4
LR 3,A
MXP6 NOP Byte with bit on left in 3
LR A,1
SR 1
LR 1,A
LR A,2
NI H'1'
BZ MXP7
LR A,1
AI H'4'
LR 1,A This is now the offset in the byte
MXP7 NOP
DCI JSAV
LR Q,DC
CM
BZ MXPX No change in position so exit
*Now we want to remove the old cursor and write the new
PI MXPS Write new cursor
DCI JSAV
LR Q,DC
LM
LR 0,A
LR A,1
LR DC,Q
ST Save new value
LR A,0
LR 1,A Get ready to delete old cursor
LR Q,DC
LM
LR 0,A
LR A,4
LR DC,Q
ST
LR A,0
LR 4,A
CI H'07'
BM MXPX No old cursor to remove
PI MXPS
MXPX PI POPS
PK
*Subroutine to complement cursor (to remove old one or write new one)
MXPS LR K,P
DCI TAB1
LR A,4
SL 1
ADC
LM
LR QU,A
LM
LR QL,A
LIS H'4'
LR 5,A
DCI TAB2
LR A,1
ADC
LM
LR DC,Q
ADC
XDC
DCI POIN
PUTP LM
XDC
LR Q,DC
XM Compliment POIN
LR DC,Q
ST
LIS H'7'
ADC
XDC
DS 5
BP PUTP
PK
*
*Subroutine to reduce range and invert if necessary
MXPA LR K,P
LR A,0
SR 1
SR 1
SR 1
LR 0,A
LR A,7 Check color
NS 7
BNZ MXPB Do we need to invert?
LR A,0
COM
AI D'25'
LR 0,A
MXPB PK
*
*
*
CURS LR K,P
PI PUSH
MAP2 PI WAUD WAIT,THEN DO UPDATE
LIS H'8'
MAP3 DCI H'8FB' DCO TO CURRENT Y LO
CM
BNZ MAP3 TO START OF DISPLAY?
LIS H'1' YES, WE CAN START JOYREAD
LR HU,A SET FOR HORIZONTAL POT
PI JOYI GET JOYSTICK INPUT
LR 1,A SAVE IN REGISTER 1
LIS H'0'
LR HU,A SET FOR VERTICAL POT
PI JOYI AND READ SAME
LR 0,A SAVING READING IN REG 0
PI AMAP NOW CONVERT VERTICAL READING
LR A,1 GET HORIZONTAL READING
LR 0,A SET IT FOR CONVERSION
LR A,2 GET LAST VALUE
LR 1,A AND SAVE VERT. CONV. IN R1
PI AMAP NOW CONVERT HORIZONTAL READING
LR A,2 RECOVER CONVERTED HORIZONTAL
AS 1 ADD IN VERTICAL
NI H'1' MASK
BNZ MAP5 IF SUM EVEN, NOT ON LEGIT SQ
DS 2 NOT LEGIT,SO DEC X POSIT.
BP MAP5 CLICKS BACK?
LIS H'1' YES, SO INCREMENT
LR 2,A X COORD.
MAP5 LR A,1 LEGIT. GET VERTICAL
SL 4 MULT BY 16
AS 2 ADD IN HORIZONTAL
LR 0,A AND SAVE IN REG 0
DCI JSAV DCO TO LAST JOYSTICK RECORD
CM COMPARE IT WITH CURRENT
BNZ MAP4 IF DIFFERENT, SHOW NEW POSIT
CLR SAME READING
OUTS 1
NOP NOPS FOR FCC
NOP
NOP
INS 1
NI H'1' STRIP TO DESIRED BIT
BZ MAP2 BUTTON PRESSED?
LR A,0 RECOVER JOYSTICK READING
ST AND SAVE IN JSAV+1
JMP WAU1 WAIT, UPDATE, AND RETURN
MAP4 PI MVC DIFFERENT--SO REMOVE OLD CURSOR
DCI JSAV
LR A,0 GET N READING
ST RESET STORE VALUE
PI MVC TURN ON NEW POSITION
BR MAP2 AND GO BACK FOR MORE
******************************
*SET CURSOR (OR REMOVE IT) *
******************************
*USED: ACC, Q, DCO, DC1, R1 *
******************************
MVC LR K,P SAVE RETURN ADDRESS
DCI JSAV DCO TO JOYSTICK READ
LM RECOVER IT
LR 1,A AND SAVE TEMPORARILY IN R1
DCI TABL DCO TO JOYTABLE
SR 4
SL 1 STRIPO 2 X(YCOORD)
ADC ADD OFFSET FOR Y COORD
LM GET HIGH ORDER
LR QU,A SAVE IN QU
LM GET LOWER
LR QL,A AND SAVE IN QLOWER
LR DC,Q LOAD IN TO DCO
LIS H'F'
NS 1 STRIP TO X COORD
ADC ADD IN APPROPRIATELY
XDC NOW SAVE DESTINATION
LIS H'4'
LR 1,A SET COUNTER
DCI POIN DCO TO CURSOR
MVC1 LM GET CURSOR BYTE
XDC SAVE ADDRESS, & RECOVER DEST
LR Q,DC SAVE DEST ADDR
XM OR IN (OR XOR OUT)
LR DC,Q RECOVER ADDRESS OF DEST.
ST RESET
LIS H'7' OFFSET TO NEXT DEST
ADC ? ADD IT IN
XDC RECOVER SOURCE ADDR.
DS 1 DECREMENT COUNTER
BNZ MVC1 DONE?
PK YES, RETURN